package com.ztjy.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.PropertyFilter;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.serializer.SimplePropertyPreFilter;

import java.util.List;

/**
 * 神州鹰掌通家园项目组
 * Title: Json处理工具类
 * Description:
 * Copyright: Copyright (c) 2014 厦门神州鹰软件科技有限公司
 *
 * @author 胡耀忠
 * 创建时间:2014-8-11下午01:43:40
 */
@SuppressWarnings("unchecked")
public class JsonUtils {

    /**
     * 方法描述：将对象属性转为json格式字符串
     *
     * @param obj
     * @return
     * @author: 胡耀忠 hyz
     * @date： 日期：2014-8-11 时间：下午01:44:21
     * @version 1.0
     */
    public static String getJson(Object obj) {
        return JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat, SerializerFeature.DisableCircularReferenceDetect);
    }

    /**
     * 方法描述: 同上，支持泛型
     *
     * @param @param  <T>
     * @param @param  json
     * @param @param  cls
     * @param @return
     * @author 许谋钧
     * @date 日期:2016-6-20
     * @version
     */
    public static <T> T readValue(String json, Class<? extends T> cls) {
        try {
            return JSON.parseObject(json, cls);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 方法描述：将json数组字符串转化为数组
     *
     * @param json
     * @param cls
     * @return
     * @author: 胡耀忠 hyz
     * 日期：2014-12-1 时间：上午09:03:14
     * @version 1.0
     */
    public static List readJson2List(String json, @SuppressWarnings("rawtypes") Class cls) {
        try {
            return JSON.<Object>parseArray(json, cls);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 方法描述：对象转json格式，排除不需要的属性
     *
     * @param obj
     * @param params 不需要的属性名称
     * @return
     * @author: 胡耀忠 hyz
     * @date： 日期：2014-8-11 时间：下午01:45:08
     * @version 1.0
     */
    public static String getJsonExcludeProperties(Object obj, final String... params) {
        PropertyFilter filter = new PropertyFilter() {
            // 过滤不需要的字段
            @Override
            public boolean apply(Object source, String name, Object value) {
                for (int i = 0; i < params.length; i++) {
                    if (params[i].equals(name)) {
                        return false;
                    }
                }
                return true;
            }
        };
        return JSON.toJSONString(obj, filter);
    }

    /**
     * 方法描述：只获取需要的属性
     *
     * @param obj
     * @param params 需要的属性
     * @return
     * @author: 胡耀忠 hyz
     * @date： 日期：2014-8-11 时间：下午01:45:55
     * @version 1.0
     */
    public static String getJsonIncludeProperties(Object obj, final String... params) {
        SimplePropertyPreFilter filter = new SimplePropertyPreFilter(obj.getClass(), params);
        return JSON.toJSONString(obj, filter);
    }

}
